package com.example.mytk2_14;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
// 类MainActivity实现了接口View.OnClickListener，MainActivity也是一个按键事件监听器
public class MainActivity extends AppCompatActivity  implements View.OnClickListener  {
    TextView tv_state;//用于显示连接状态的文本框，包括：已连接和网络断开 2种状态
    EditText ip_edit; //用于引用IP地址编辑框
    EditText ip_port; //用于引用端口号编辑框

    Button bt_connect;//用于引用连接按钮
    Button bt_close;//用于引用关闭按钮
    TextView bj1,bj2,bj3; //用于引用 锁1状态显示，锁2状态显示，锁3状态显示
    Button bt1,bt2,bt3;//用于引用关闭锁1按钮，关闭锁2按钮，关闭锁3按钮

    String ip;  //用于存储IP地址
    int port;  //用于存储端口号
    Socket ss;  //网络通信使用的Socket

    DataOutputStream dataOutputStream=null;//网络通信使用的数据输出流，用于发送指令



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //根据组件id号R.id.tv_state获得连接状态组件TextView的引用,tv_state
        tv_state=(TextView)this.findViewById(R.id.tv_state);

        //任务3_1 ：根据组件id号R.id.ip_edit查找IP地址编辑框EditText组件的引用，使用变量ip_edit保存
        ip_edit=(EditText)this.findViewById(R.id.ip_edit);
        //结束任务3_1

        ip_port=(EditText)this.findViewById(R.id.ip_port);

        bj1=(TextView)this.findViewById(R.id.tv_bj1);
        bj2=(TextView)this.findViewById(R.id.tv_bj2);
        bj3=(TextView)this.findViewById(R.id.tv_bj3);

        bt_connect=(Button)this.findViewById(R.id.btn_conn);
        bt_close=(Button)this.findViewById(R.id.btn_close);
        bt_connect.setOnClickListener(this); //bt_connect设置事件监听器
        bt_close.setOnClickListener(this);   //bt_close设置事件监听器

        bt1=(Button)this.findViewById(R.id.bt_btn1);
        bt2=(Button)this.findViewById(R.id.bt_btn2);
        bt3=(Button)this.findViewById(R.id.bt_btn3);

        bt1.setOnClickListener(this);//bt1设置事件监听器
        bt2.setOnClickListener(this);//bt2设置事件监听器
        bt3.setOnClickListener(this);//bt3设置事件监听器

    }

    //连接服务器
    void connectToServer()
    {
        //任务3_2 ：从IP地址编辑框ip_edit获取IP地址并保存到变量ip
        ip=ip_edit.getText().toString().trim();
        //结束任务3_2
		port= Integer.parseInt(ip_port.getText().toString().trim());

        new Thread(new Runnable(){
            @Override
            public void run() {
                //连接网路，如果不产生异常，说明连接成功，设置tv_state文本为已连接
                try {
                //任务3_3 ：实现建立Socket网络连接 
                    ss=new Socket(ip,port);
                    //结束任务3_3
				   //数据输出流DataInputStream
					dataOutputStream=new DataOutputStream(ss.getOutputStream());

                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            //任务3_4 ：实现文本框tv_state显示为"已连接"状态
                            tv_state.setText("已连接");
                            //结束任务3_4
                        }
						
                    });

                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }
    //关闭连接
    void closeConnect()
    {
        try {
            ss.close();
            tv_state.setText("网络断开");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //关闭1号锁点
    void stopBJ1()
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {

                    //发送关闭锁控制指令串0x 55 BB 01 1B 00, 锁点锁状态转变为 "1号锁:关闭"
                    byte zl[]=new byte[]{(byte)0x55,(byte)0xBB,(byte)0x01,(byte)0x1B,(byte)0x00};
                    dataOutputStream.write(zl);  // 写指令,即发送指令

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            bj1.setText("1号锁:关闭");
                        }
                    });

                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        }).start();


    }

    //关闭2号锁点
    void stopBJ2()
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {

                    //任务3_5 ：发送关闭锁控制指令串0x 55 BB 02 1B 00, 锁点锁状态转变为 "2号锁:关闭"
                    byte zl[]=new byte[]{(byte)0x55,(byte)0xBB,(byte)0x02,(byte)0x1B,(byte)0x00};
                    dataOutputStream.write(zl);  // 写指令,即发送指令

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            bj2.setText("2号锁:关闭");
                        }
                    });
                  //结束任务3_5
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        }).start();


    }

    //关闭3号锁点
    void stopBJ3()
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {

                    //任务3_6 ：发送关闭锁控制指令串0x 55 BB 03 1B 00, 锁点锁状态转变为 "3号锁:关闭"
                    byte zl[]=new byte[]{(byte)0x55,(byte)0xBB,(byte)0x03,(byte)0x1B,(byte)0x00};
                    dataOutputStream.write(zl);  // 写指令,即发送指令

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            bj3.setText("3号锁:关闭");
                        }
                    });
                    //结束任务3_6
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        }).start();


    }

    //按键处理
    @Override
    public void onClick(View view) {


        switch(view.getId())  //获得组件ID号，根据按键ID号调用不同按键处理函数
        {
            case R.id.btn_conn:  //连接按钮
                connectToServer();
                break;
            case R.id.btn_close:  //关闭按钮
                closeConnect();
                break;
            case  R.id.bt_btn1:   //关闭锁1按钮
                stopBJ1();
                break;
            case  R.id.bt_btn2:  //关闭锁2按钮
                stopBJ2();
                break;
            case  R.id.bt_btn3: //关闭锁3按钮
                stopBJ3();
                break;


        }

    }
}